"""
题目描述：
使用函数式编程工具（lambda、map、filter、reduce、生成器）解决以下问题：
1.	给定列表numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]，用map和lambda将所有偶数转换为其平方，奇数保持不变；
2.	用filter筛选出转换后列表中大于20的元素；
3.	用reduce计算筛选后列表的乘积；
4.	定义一个生成器函数prime_generator(n)，生成1-n之间的所有质数（质数：大于1的自然数，除1和自身外无其他因数）。
要求：
•	第1-3步结果需连续计算（可链式调用）；
•	生成器需通过yield实现，避免一次性生成所有数据。
"""
# reduce 会将 function 应用于序列的元素，从左到右累积计算结果：
# 1. 首先将 function 应用于前两个元素，得到一个结果
# 2. 然后将这个结果与下一个元素一起应用 function
# 3. 继续这个过程，直到处理完所有元素
from functools import reduce

# 1. 转换列表
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#map(function, iterable)
#function: 这是你想要应用到 iterable 每个元素上的函数。它可以是一个普通的函数名，也可以是一个 lambda 表达式。
#iterable: 这是包含你想要处理的元素的可迭代对象，比如列表 (list)、元组 (tuple)、字符串 (str) 等。
transformed = list(map(lambda x: x**2 if x % 2 == 0 else x, numbers))
# [1, 4, 3, 16, 5, 36, 7, 64, 9, 100]

# 2. 筛选大于20的元素
filtered = list(filter(lambda x: x > 20, transformed))
# [36, 64, 100]

# 3. 计算乘积
#result = reduce(function, iterable[, initializer])
#function: 这是一个接受两个参数的函数。它定义了如何将两个元素“合并”或“累积”成一个结果。
# iterable: 这是你要对其进行累积操作的可迭代对象，例如列表、元组等。
product = reduce(lambda x, y: x * y, filtered, 1)#1是初始值
# 230400

# - 使用 yield 而不是 return ，使函数成为生成器
# - 每次调用 yield 会暂停函数执行并返回一个值
# - 下次调用时会从暂停处继续执行
# - 生成器是惰性求值的，只在需要时计算下一个值，节省内存
# 4. 质数生成器
def prime_generator(n):
    if n < 2:
        return#return的作用是提前借宿生成器函数的执行
    yield 2#2是最小的质数
    for num in range(3, n + 1, 2): # 从3开始检查奇数
        is_prime = True
        for i in range(3, int(num**0.5) + 1, 2):#检查从 3 到 num 的平方根的所有奇数，看是否能整除 num
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            yield num

# 示例用法
print("转换后:", transformed)
print("筛选后:", filtered)
print("乘积:", product)
print("质数(<=20):", list(prime_generator(20)))
# 输出:
# 转换后: [1, 4, 3, 16, 5, 36, 7, 64, 9, 100]
# 筛选后: [36, 64, 100]
# 乘积: 230400
# 质数(<=20): [2, 3, 5, 7, 11, 13, 17, 19]